import { ref, unref } from 'vue'

export function useLockFn<P extends any[] = any[], V = any>(fn: (...args: P) => Promise<V>) {
  const lockRef = ref(false)
  return async function (...args: P) {
    if (unref(lockRef))
      return
    lockRef.value = true
    try {
      const ret = await fn(...args)
      lockRef.value = false
      return ret
    }
    catch (e) {
      lockRef.value = false
      throw e
    }
  }
}
